package com.hejing.初识泛型;

import org.junit.Test;

import java.util.*;

/**
 * ClassName: CollectionMapTest
 * Package: com.hejing.初识泛型
 * Description:
 *
 * @Author: HeJing
 * @Create: 2023-05-21 18:30
 * @Version: 1.0
 */
public class CollectionMapTest {

    /**
     * 体会集合中没有使用泛型的场景
     */
    @Test
    public void test01(){
        List list = new ArrayList();
        // 装入学生成绩
        list.add(67);
        list.add(32);
        list.add(60);
        list.add(76);
        // 问题1: 类型不安全，因为add()的参数是Object类型，意味着任何类型的对象都可以添加成功。
        // list.add(true);  // 不太靠谱

        Iterator iterator = list.iterator();
        while(iterator.hasNext()) {
            // 问题2: 需要使用强转操作，繁琐，还可能导致ClassCastException异常。
            Integer i = (Integer) iterator.next();
            int score = i;
            System.out.println(score);
        }
    }

    /**
     * 泛型在List中使用的场景
     */
    @Test
    public void test02(){
        List<Integer> list = new ArrayList<Integer>();

        list.add(73);
        list.add(32);
        list.add(23);
        list.add(93);
        // 编译报错，保证了类型的安全
        // list.add(true);

        Iterator<Integer> iterator = list.iterator();
        while(iterator.hasNext()) {
            // 因为添加的都是Integer类型，避免了强转操作。
            Integer i = iterator.next();
            int score = i;
            System.out.println(score);
        }
    }

    /**
     * 泛型在map中使用的场景:
     */
    @Test
    public void test03(){
        // HashMap<String, Integer> map = new HashMap<String, Integer>();
        HashMap<String, Integer> map = new HashMap<>();  // 第二个<>中的类型可以省略，称之为 类型推断(jdk7开始)

        map.put("Tom", 75);
        map.put("Jerry", 89);
        map.put("Luffy", 60);

        // Set<Map.Entry<String, Integer>> entries = map.entrySet();
        // Iterator<Map.Entry<String, Integer>> iterator = entries.iterator();


        var entries = map.entrySet();  // jdk10, 有类型推导功能
        var iterator = entries.iterator(); // jdk10

        while(iterator.hasNext()) {
            Map.Entry<String, Integer> entry = iterator.next();
            String key = entry.getKey();
            Integer value = entry.getValue();

            System.out.println(key + ": " + value);
        }

    }
}



























